package codingInterview.leetcode.editor.cn;

//给你一根长度为 n 的绳子，请把绳子剪成整数长度的 m 段（m、n都是整数，n>1并且m>1），每段绳子的长度记为 k[0],k[1]...k[m-1] 。
//请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少？例如，当绳子的长度是8时，我们把它剪成长度分别为2、3、3的三段，此时得到的最大乘积是18
//。 
//
// 示例 1： 
//
// 输入: 2
//输出: 1
//解释: 2 = 1 + 1, 1 × 1 = 1 
//
// 示例 2: 
//
// 输入: 10
//输出: 36
//解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36 
//
// 提示： 
//
// 
// 2 <= n <= 58 
// 
//
// 注意：本题与主站 343 题相同：https://leetcode-cn.com/problems/integer-break/ 
// Related Topics 数学 动态规划 👍 373 👎 0

//Java：剑指 Offer 14- I - 剪绳子
public class JianShengZiLcof{
    public static void main(String[] args) {
                Solution solution = new JianShengZiLcof().new Solution();
        // TO TEST
    }
    
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int cuttingRope(int n) {
        if(n<2) return 0;
        if(n==2) return 1;
        if(n==3) return 2;
        int[] res = new int[n+1];
        res[0] = 0;
        res[1] = 1;
        res[2] = 2;
        res[3] = 3;
        for (int i = 4; i <= n; i++) { //对于i米的绳子
            int max =0;
            for (int j = 1; j <= i / 2; j++) {
                int mul = res[j]*res[i-j];
                if (max<mul)
                    max =mul;
                res[i]=max;
            }
        }
        return res[n];
    }
}
//leetcode submit region end(Prohibit modification and deletion)

    /**
     * 方案二：贪心
     */
    public int cuttingRope(int n) {
        if(n<2) return 0;
        if(n==2) return 1;
        if(n==3) return 2;
        int a = n/3;
        int b = 0;
        if(n%3==1){
            a-=1;
            b=2;
        }else if(n%3==2){
            b=1;
        }
        return (int)(Math.pow(3,a)*Math.pow(2,b));
    }

}
